/**
 * @(#)PrivilegioBean.java 
 *  
 * Esta clase presenta la informacion de un rol  
 * 
 * @version 1.0
 * @date 01/11/12 
 * @author Nelson Chicas
 *  
 */

package muhnes.sizoo.controlador;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import muhnes.sizoo.dal.FabricaDAO;
import muhnes.sizoo.dal.ObjetoDao;
import muhnes.sizoo.dal.OperacionDao;
import muhnes.sizoo.dal.PrivilegioDao;
import muhnes.sizoo.dal.RolDao;
import muhnes.sizoo.modelo.Objeto;
import muhnes.sizoo.modelo.Operacion;
import muhnes.sizoo.modelo.Otorgamiento;
import muhnes.sizoo.modelo.Privilegio;
import muhnes.sizoo.modelo.Rol;
import muhnes.sizoo.util.Transaccion;

/**
 * Clase que contiene los metodos que controlan la vista de roles de usuario
 * @author Ricardo Orellana
 */
@ManagedBean(name = "rolBean")
@ViewScoped
public class RolBean extends CRUDBean< Rol, RolDao > implements Serializable {
    
    private List< Privilegio > listaPrivilegios;
    private List< SelectItem > itemsPrivilegio;
    private SelectItem[] itemsObjeto;
    private SelectItem[] itemsOperacion;
    private List< SelectItem > itemsPrivilegios;

    public RolBean() {
        super( Rol.class );
        vistaProtegida = "rol";
    }
    
    /**
     * Metodo para obtener un listado de privilegios
     * @return lista de item
     */
    public List< Privilegio > getListaPrivilegios() {
        if( listaPrivilegios == null ) {
            PrivilegioDao privilegioDao = FabricaDAO.crearPrivilegioDao();
            listaPrivilegios = privilegioDao.buscarTodos();
        }
        return listaPrivilegios;
    }
    
    /**
     * Metodo para obtener los privilegios 
     * @return lista de item
     */
    public List< SelectItem > getItemsPrivilegio() {
        if( itemsPrivilegio == null ) {
            itemsPrivilegio = new ArrayList< SelectItem >();
            PrivilegioDao privilegioDao = FabricaDAO.crearPrivilegioDao();
            for( Privilegio privilegio : privilegioDao.buscarTodos() ) {
                Privilegio p = privilegioDao.removerProxy(privilegio);
                SelectItem item = new SelectItem( p, p.getNombre() );
                itemsPrivilegio.add( item );
            }
        }
        return itemsPrivilegio;
    }
    
    /**
     * Metodo para obtener una lista de objetos
     * @return lista de item
     */
    public SelectItem[]  getItemsObjeto() {
            ObjetoDao objetoDao = FabricaDAO.crearObjetoDao();
            List<Objeto> objetos = objetoDao.buscarTodos();
            itemsObjeto = new SelectItem[objetos.size() + 1];
            itemsObjeto[0] = new SelectItem("","Seleccione...");
            for( int i = 0; i<objetos.size(); ++i ) {
                Objeto objeto = objetos.get(i);
                itemsObjeto[i+1] = new SelectItem (objeto.getNombre(),objeto.getNombre() );
            }
        return itemsObjeto;
    }
    
    /**
     * Metodo para mantener los items de operacion 
     * @return lista de item
     */
    public SelectItem[] getItemsOperacion() {
        OperacionDao operacionDao = FabricaDAO.crearOperacionDao();
            List<Operacion> operaciones = operacionDao.buscarTodos();
            itemsOperacion = new SelectItem[operaciones.size() + 1];
            itemsOperacion[0] = new SelectItem("","Seleccione...");
            for( int i = 0; i<operaciones.size(); ++i ) {
                Operacion operacion = operaciones.get(i);
                itemsOperacion[i+1] = new SelectItem (operacion.getNombre(),operacion.getNombre() );
            }
        return itemsOperacion;
    }
    
    /**
     * Metodo para obtener una lista de privilegios por rol
     * @return lista de privilegios
     */
    public List<Privilegio> getPrivilegiosRol() {
        List<Privilegio> privilegiosRol = new ArrayList<Privilegio>();
        for( Privilegio privilegio : entidad.getPrivilegios() ) {
            privilegiosRol.add( privilegio );
        }
        return privilegiosRol;
    }
    
    /**
     * Metodo para asignar los privilegios dependiendo del rol
     * @param privilegios listado de privilegios
     */
    public void setPrivilegiosRol( List<Privilegio> privilegios ) {
        Set<Privilegio> privilegiosRol = new HashSet<Privilegio>();
        for( Privilegio privilegio : privilegios ) {
            privilegiosRol.add( privilegio );
        }
        entidad.setPrivilegios(privilegiosRol);
    }

    /**
     * Metodo para obtener los privilegios
     * @return 
     */
    public List<SelectItem> getItemsPrivilegios() {
        if(itemsPrivilegios == null){
            itemsPrivilegios = new ArrayList< SelectItem >();
            SelectItem habilitado = new SelectItem("Habilitado");
            itemsPrivilegios.add(habilitado);
            SelectItem deshabilitado = new SelectItem("Deshabilitado");
            itemsPrivilegios.add(deshabilitado);
        }
        return itemsPrivilegios;
    }
    
    /**
     * Metodo actualizar privilegios 
     * @param otorgamiento 
     */
    public void actualizarPrivilegio( Otorgamiento otorgamiento ) {
        entidad.setOtorgamiento(otorgamiento);
        RolDao rolDao = FabricaDAO.crearRolDao();
        rolDao.actualizar( entidad );
    }
    
    /**
     * Metodo para elminar la entidad dependiendo si tiene o no dependencias
     * @param event 
     */
    @Override
    public void eliminarEntidad( ActionEvent event ) {
        if( !validarDependencia() ) {
            return;
        }
        
        RolDao dao = FabricaDAO.crearRolDao();
        entidad.getUsuarios().clear();
        entidad.getPrivilegios().clear();
        dao.actualizar( entidad );
        dao.eliminar( entidad );
        recrearModelo();
    }

    @Override
    protected RolDao getDAO () {
        return FabricaDAO.crearRolDao();
    }

    /**
     * Metodo para permitir las transacciones a realizar
     * @param transaccion
     * @return 
     */
    @Override
    protected boolean debeValidar (Transaccion transaccion) {
        boolean validacion = false;
        
        switch( transaccion ) {
            case INSERCION:
            case ACTUALIZACION:
            case ELIMINACION:
                validacion = true;
        }
        
        return validacion;
    }

}


